#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>

#define TASK_NUM 10
typedef void(*task_t)();
task_t tasks[TASK_NUM];

void task1()
{
    printf("这是一个执行打印日志的任务, pid: %d\n", getpid());
}

void task2()
{
    printf("这是一个执行检测网络健康状态的一个任务, pid: %d\n", getpid());
}

void task3()
{
    printf("这是一个绘制图形界面的任务, pid: %d\n", getpid()); 
}

int AddTask(task_t t);

void InitTask()
{
    int i = 0;
    for(i = 0; i < TASK_NUM; i++) 
        tasks[i] = NULL;
    AddTask(task1);
    AddTask(task2);
    AddTask(task3);
}

int AddTask(task_t t)
{
    int pos = 0;
    for(pos = 0; pos < TASK_NUM; pos++)
    {
        if(!tasks[pos]) break;
    }
    if(pos == TASK_NUM) return -1;
    tasks[pos] = t;
    return 0;
}

void DelTask() {}

void CheckTask() {}

void UpdateTask() {}

void ExecuteTask()
{
    int i = 0;
    for(i = 0; i < TASK_NUM; i++)
    {
        if(!tasks[i]) continue;
        tasks[i]();
    }
}
int main()
{
    pid_t id = fork();
    if(id < 0)
    {
        perror("fork");
        return 1;
    }
    else if(id == 0)
    {
        int cnt = 5;
        while(cnt)
        {
            printf("I am child, pid: %d,ppid: %d, cnt: %d\n", getpid(), getppid(), cnt);
            cnt--;
            sleep(1);
        }
        exit(11);
    }

    else 
    {
        int status = 0;
        InitTask();
        while(1)
        {
            pid_t ret = waitpid(id, &status, WNOHANG);
            if(ret > 0)
            {
                if(WIFEXITED(status))
                {
                    printf("进程正常跑完的, 退出码: %d\n", WEXITSTATUS(status));

                }
                else 
                {
                    printf("进程出异常了\n");
                }
                break;
            }
            else if(ret < 0)
            {
                printf("wait failed!\n");
                break;
            }
            else 
            {
                ExecuteTask();
                sleep(500000);
            }
        }
    }
    return 12;
}


//#define N 10
//
//void RunChild()
//{
//    int cnt = 5;
//    while(cnt)
//    {
//        printf("I am Child Process, pid: %d, ppid: %d\n", getpid(), getppid());
//        sleep(1);
//        cnt--;
//    }
//}
//int main()
//{
//    int i = 0;
//    for(i = 0; i < N; i++)
//    {
//        pid_t id = fork();
//        if(id == 0)
//        {
//            RunChild();
//            exit(i);
//        }
//        printf("create child process: %d success\n", id);
//    }
//
//    for(i = 0; i < N; i++)
//    {
//        int status = 0;
//        pid_t id = waitpid(-1, &status, 0);
//        if(id > 0)
//        {
//            printf("wait %d success, exit code: %d\n", id, WEXITSTATUS(status));
//
//        }
//    }
//    sleep(5);
//
//
//}
